PO.DAAC ECCO SSH

Reading ECCO Sea Surface Height (SSH) Data Using Kerchunk Reference File

Many of NASA’s current and legacy data collections are archive in netCDF4 format. By itself, netCDF4 are not cloud optimized and reading these files can take as long from a personal/local work environment as it takes to read the data from a working environment deployed in the cloud. Using Kerchunk, we can treat these files as cloud optimized assets by creating metadata json file describing existing netCDF4 files, their chunks, and where to access them. The json reference files can be read in using Zarr and Xarray for efficient reads and fast processing.

Requirements

1. AWS instance running in us-west-2

NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.

2. Earthdata Login

An Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.

3. netrc File

You will need a netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.

Import required packages

import requests
import xarray as xr
import ujson
import s3fs
import fsspec
from tqdm import tqdm
from glob import glob
import os
import pathlib
import hvplot.xarray

from kerchunk.hdf import SingleHdf5ToZarr
from kerchunk.combine import MultiZarrToZarr

# The xarray produced from the reference file throws a SerializationWarning for each variable. Will need to explore why
import warnings
warnings.simplefilter("ignore")

Create Dask client to process the output json file in parallel

Generating the Kerchunk reference file can take some time depending on the internal structure of the data. Dask allows us to execute the reference file generation process in parallel, thus speeding up the overall process.

import dask
from dask.distributed import Client
client = Client(n_workers=4)
client
2022-05-11 15:27:29,674 - distributed.diskutils - INFO - Found stale lock file and directory '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/dask-worker-space/worker-mezhdsy7', purging
/srv/conda/envs/notebook/lib/python3.9/contextlib.py:126: UserWarning: Creating scratch directories is taking a surprisingly long time. This is often due to running workers on a network file system. Consider specifying a local-directory to point workers to write scratch data to a local disk.
  next(self.gen)

Client

Client-ddf55e52-d13e-11ec-818c-b6609e8b92a4

Connection method: Cluster object Cluster type: distributed.LocalCluster
Dashboard: http://127.0.0.1:41805/status

Cluster Info

Worker: 1

Comm: tcp://127.0.0.1:40997 Total threads: 1
Dashboard: http://127.0.0.1:41189/status Memory: 3.80 GiB
Nanny: tcp://127.0.0.1:35257
Local directory: /home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/dask-worker-space/worker-3mo0d80c

Worker: 2

Comm: tcp://127.0.0.1:46429 Total threads: 1
Dashboard: http://127.0.0.1:42211/status Memory: 3.80 GiB
Nanny: tcp://127.0.0.1:34287
Local directory: /home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/dask-worker-space/worker-o2fvmao4

Worker: 3

Comm: tcp://127.0.0.1:41615 Total threads: 1
Dashboard: http://127.0.0.1:41507/status Memory: 3.80 GiB
Nanny: tcp://127.0.0.1:43053
Local directory: /home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/dask-worker-space/worker-9u77hywd

Get temporary S3 credentials

Temporary S3 credentials need to be passed to AWS. Note, these credentials must be refreshed after 1 hour.

s3_cred_endpoint = {
    'podaac':'https://archive.podaac.earthdata.nasa.gov/s3credentials',
    'lpdaac':'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials',
    'ornldaac':'https://data.ornldaac.earthdata.nasa.gov/s3credentials',
    'gesdisc':'https://data.gesdisc.earthdata.nasa.gov/s3credentials'
}
def get_temp_creds():
    temp_creds_url = s3_cred_endpoint['podaac']
    return requests.get(temp_creds_url).json()
temp_creds_req = get_temp_creds()

Direct Access a single netCDF4 file

Pass temporary credentials to our filesystem object to access the S3 assets

fs = s3fs.S3FileSystem(
    anon=False,
    key=temp_creds_req['accessKeyId'],
    secret=temp_creds_req['secretAccessKey'],
    token=temp_creds_req['sessionToken']
)
url = 's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-01_ECCO_V4r4_latlon_0p50deg.nc'
s3_file_obj = fs.open(url, mode='rb')

Time how long it takes to directly access a cloud asset for comparisons later.

%%time

xr_ds = xr.open_dataset(s3_file_obj, chunks='auto', engine='h5netcdf')
xr_ds
CPU times: user 228 ms, sys: 8.51 ms, total: 237 ms
Wall time: 272 ms
<xarray.Dataset>
Dimensions:         (time: 1, latitude: 360, longitude: 720, nv: 2)
Coordinates:
  * time            (time) datetime64[ns] 2015-01-16T12:00:00
  * latitude        (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75
  * longitude       (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8
    time_bnds       (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>
    latitude_bnds   (latitude, nv) float32 dask.array<chunksize=(360, 2), meta=np.ndarray>
    longitude_bnds  (longitude, nv) float32 dask.array<chunksize=(720, 2), meta=np.ndarray>
Dimensions without coordinates: nv
Data variables:
    SSH             (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
    SSHIBC          (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
    SSHNOIBC        (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
Attributes: (12/57)
    acknowledgement:              This research was carried out by the Jet Pr...
    author:                       Ian Fenty and Ou Wang
    cdm_data_type:                Grid
    comment:                      Fields provided on a regular lat-lon grid. ...
    Conventions:                  CF-1.8, ACDD-1.3
    coordinates_comment:          Note: the global 'coordinates' attribute de...
    ...                           ...
    time_coverage_duration:       P1M
    time_coverage_end:            2015-02-01T00:00:00
    time_coverage_resolution:     P1M
    time_coverage_start:          2015-01-01T00:00:00
    title:                        ECCO Sea Surface Height - Monthly Mean 0.5 ...
    uuid:                         088d03b8-4158-11eb-876b-0cc47a3f47f1
  • acknowledgement :
    This research was carried out by the Jet Propulsion Laboratory, managed by the California Institute of Technology under a contract with the National Aeronautics and Space Administration.
    author :
    Ian Fenty and Ou Wang
    cdm_data_type :
    Grid
    comment :
    Fields provided on a regular lat-lon grid. They have been mapped to the regular lat-lon grid from the original ECCO lat-lon-cap 90 (llc90) native model grid. SSH (dynamic sea surface height) = SSHNOIBC (dynamic sea surface without the inverse barometer correction) - SSHIBC (inverse barometer correction). The inverted barometer correction accounts for variations in sea surface height due to atmospheric pressure variations.
    Conventions :
    CF-1.8, ACDD-1.3
    coordinates_comment :
    Note: the global 'coordinates' attribute describes auxillary coordinates.
    creator_email :
    ecco-group@mit.edu
    creator_institution :
    NASA Jet Propulsion Laboratory (JPL)
    creator_name :
    ECCO Consortium
    creator_type :
    group
    creator_url :
    https://ecco-group.org
    date_created :
    2020-12-18T09:39:51
    date_issued :
    2020-12-18T09:39:51
    date_metadata_modified :
    2021-03-15T22:07:49
    date_modified :
    2021-03-15T22:07:49
    geospatial_bounds_crs :
    EPSG:4326
    geospatial_lat_max :
    90.0
    geospatial_lat_min :
    -90.0
    geospatial_lat_resolution :
    0.5
    geospatial_lat_units :
    degrees_north
    geospatial_lon_max :
    180.0
    geospatial_lon_min :
    -180.0
    geospatial_lon_resolution :
    0.5
    geospatial_lon_units :
    degrees_east
    history :
    Inaugural release of an ECCO Central Estimate solution to PO.DAAC
    id :
    10.5067/ECG5M-SSH44
    institution :
    NASA Jet Propulsion Laboratory (JPL)
    instrument_vocabulary :
    GCMD instrument keywords
    keywords :
    EARTH SCIENCE > OCEANS > SEA SURFACE TOPOGRAPHY > SEA SURFACE HEIGHT, EARTH SCIENCE SERVICES > MODELS > EARTH SCIENCE REANALYSES/ASSIMILATION MODELS
    keywords_vocabulary :
    NASA Global Change Master Directory (GCMD) Science Keywords
    license :
    Public Domain
    metadata_link :
    https://cmr.earthdata.nasa.gov/search/collections.umm_json?ShortName=ECCO_L4_SSH_05DEG_MONTHLY_V4R4
    naming_authority :
    gov.nasa.jpl
    platform :
    ERS-1/2, TOPEX/Poseidon, Geosat Follow-On (GFO), ENVISAT, Jason-1, Jason-2, CryoSat-2, SARAL/AltiKa, Jason-3, AVHRR, Aquarius, SSM/I, SSMIS, GRACE, DTU17MDT, Argo, WOCE, GO-SHIP, MEOP, Ice Tethered Profilers (ITP)
    platform_vocabulary :
    GCMD platform keywords
    processing_level :
    L4
    product_name :
    SEA_SURFACE_HEIGHT_mon_mean_2015-01_ECCO_V4r4_latlon_0p50deg.nc
    product_time_coverage_end :
    2018-01-01T00:00:00
    product_time_coverage_start :
    1992-01-01T12:00:00
    product_version :
    Version 4, Release 4
    program :
    NASA Physical Oceanography, Cryosphere, Modeling, Analysis, and Prediction (MAP)
    project :
    Estimating the Circulation and Climate of the Ocean (ECCO)
    publisher_email :
    podaac@podaac.jpl.nasa.gov
    publisher_institution :
    PO.DAAC
    publisher_name :
    Physical Oceanography Distributed Active Archive Center (PO.DAAC)
    publisher_type :
    institution
    publisher_url :
    https://podaac.jpl.nasa.gov
    references :
    ECCO Consortium, Fukumori, I., Wang, O., Fenty, I., Forget, G., Heimbach, P., & Ponte, R. M. 2020. Synopsis of the ECCO Central Production Global Ocean and Sea-Ice State Estimate (Version 4 Release 4). doi:10.5281/zenodo.3765928
    source :
    The ECCO V4r4 state estimate was produced by fitting a free-running solution of the MITgcm (checkpoint 66g) to satellite and in situ observational data in a least squares sense using the adjoint method
    standard_name_vocabulary :
    NetCDF Climate and Forecast (CF) Metadata Convention
    summary :
    This dataset provides monthly-averaged dynamic sea surface height interpolated to a regular 0.5-degree grid from the ECCO Version 4 Release 4 (V4r4) ocean and sea-ice state estimate. Estimating the Circulation and Climate of the Ocean (ECCO) state estimates are dynamically and kinematically-consistent reconstructions of the three-dimensional, time-evolving ocean, sea-ice, and surface atmospheric states. ECCO V4r4 is a free-running solution of a global, nominally 1-degree configuration of the MIT general circulation model (MITgcm) that has been fit to observations in a least-squares sense. Observational data constraints used in V4r4 include sea surface height (SSH) from satellite altimeters [ERS-1/2, TOPEX/Poseidon, GFO, ENVISAT, Jason-1,2,3, CryoSat-2, and SARAL/AltiKa]; sea surface temperature (SST) from satellite radiometers [AVHRR], sea surface salinity (SSS) from the Aquarius satellite radiometer/scatterometer, ocean bottom pressure (OBP) from the GRACE satellite gravimeter; sea-ice concentration from satellite radiometers [SSM/I and SSMIS], and in-situ ocean temperature and salinity measured with conductivity-temperature-depth (CTD) sensors and expendable bathythermographs (XBTs) from several programs [e.g., WOCE, GO-SHIP, Argo, and others] and platforms [e.g., research vessels, gliders, moorings, ice-tethered profilers, and instrumented pinnipeds]. V4r4 covers the period 1992-01-01T12:00:00 to 2018-01-01T00:00:00.
    time_coverage_duration :
    P1M
    time_coverage_end :
    2015-02-01T00:00:00
    time_coverage_resolution :
    P1M
    time_coverage_start :
    2015-01-01T00:00:00
    title :
    ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4)
    uuid :
    088d03b8-4158-11eb-876b-0cc47a3f47f1
  • Specify a list of S3 URLs

    Data Collection: ECCO_L4_SSH_05DEG_MONTHLY_V4R4
    Time Range: 2015

    urls = ['s3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2014-12_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-01_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-02_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-03_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-04_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-05_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-06_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-07_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-08_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-09_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-10_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-11_ECCO_V4r4_latlon_0p50deg.nc',
     's3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-12_ECCO_V4r4_latlon_0p50deg.nc']

    Generate the Kerchunk reference files.

    Define a function to generate the Kerchunk reference files. These files can take a little time to generate.

    def gen_json(u):
        so = dict(
            mode= "rb", 
            anon= False, 
            default_fill_cache= False,
            default_cache_type= "none"
        )
        with fs.open(u, **so) as infile:
            h5chunks = SingleHdf5ToZarr(infile, u, inline_threshold=300)
            with open(f"jsons/{u.split('/')[-1]}.json", 'wb') as outf:
                outf.write(ujson.dumps(h5chunks.translate()).encode())

    Create output jsons directory if one does not exist.

    pathlib.Path('./jsons/').mkdir(exist_ok=True)

    Use the Dask Delayed function to create the Kerchunk reference file for each URL from the list of URLs in parallel

    %%time
    
    reference_files = []
    for url in urls:
        ref = dask.delayed(gen_json)(url)
        reference_files.append(ref)
    
    reference_files_compute = dask.compute(*reference_files)
    CPU times: user 195 ms, sys: 83.4 ms, total: 278 ms
    Wall time: 1.38 s
    fs_ref_list = fsspec.filesystem('file')
    reference_list = sorted([x for x in fs_ref_list.ls('jsons') if '.json' in x])
    reference_list
    ['/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2014-12_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-01_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-02_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-03_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-04_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-05_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-06_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-07_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-08_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-09_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-10_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-11_ECCO_V4r4_latlon_0p50deg.nc.json',
     '/home/jovyan/earthdata-cloud-cookbook/examples/PODAAC/jsons/SEA_SURFACE_HEIGHT_mon_mean_2015-12_ECCO_V4r4_latlon_0p50deg.nc.json']

    Read single netCDF4 using Kerchunk reference file

    Open the first reference file to read into an xarray dataset

    with open(reference_list[0]) as j:
        reference = ujson.load(j)

    Set configurations options

    s_opts = {'skip_instance_cache':True}   #json
    r_opts = {'anon':False,          
              'key':temp_creds_req['accessKeyId'], 
              'secret':temp_creds_req['secretAccessKey'], 
              'token':temp_creds_req['sessionToken']}    #ncfiles
    fs_single = fsspec.filesystem("reference",
                                  fo=reference,
                                  ref_storage_args=s_opts,
                                  remote_protocol='s3', 
                                  remote_options=r_opts)

    Read in a single reference object. We get a lot of SerializationWarnings which are ignored here using the warning package.
    NOTE, the fill value, data range, min value, and max value may not match the source file. Will need to look into this more.

    %%time
    
    m = fs_single.get_mapper("")
    ds_single = xr.open_dataset(m, engine="zarr", backend_kwargs={'consolidated':False}, chunks={})
    ds_single
    CPU times: user 56.3 ms, sys: 26 ms, total: 82.2 ms
    Wall time: 221 ms
    <xarray.Dataset>
    Dimensions:         (time: 1, latitude: 360, longitude: 720, nv: 2)
    Coordinates:
      * latitude        (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75
        latitude_bnds   (latitude, nv) float32 dask.array<chunksize=(360, 2), meta=np.ndarray>
      * longitude       (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8
        longitude_bnds  (longitude, nv) float32 dask.array<chunksize=(720, 2), meta=np.ndarray>
      * time            (time) datetime64[ns] 2014-12-16T12:00:00
        time_bnds       (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>
    Dimensions without coordinates: nv
    Data variables:
        SSH             (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
        SSHIBC          (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
        SSHNOIBC        (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
    Attributes: (12/57)
        Conventions:                  CF-1.8, ACDD-1.3
        acknowledgement:              This research was carried out by the Jet Pr...
        author:                       Ian Fenty and Ou Wang
        cdm_data_type:                Grid
        comment:                      Fields provided on a regular lat-lon grid. ...
        coordinates_comment:          Note: the global 'coordinates' attribute de...
        ...                           ...
        time_coverage_duration:       P1M
        time_coverage_end:            2015-01-01T00:00:00
        time_coverage_resolution:     P1M
        time_coverage_start:          2014-12-01T00:00:00
        title:                        ECCO Sea Surface Height - Monthly Mean 0.5 ...
        uuid:                         08a2fc68-4158-11eb-b498-0cc47a3f6943
  • Conventions :
    CF-1.8, ACDD-1.3
    acknowledgement :
    This research was carried out by the Jet Propulsion Laboratory, managed by the California Institute of Technology under a contract with the National Aeronautics and Space Administration.
    author :
    Ian Fenty and Ou Wang
    cdm_data_type :
    Grid
    comment :
    Fields provided on a regular lat-lon grid. They have been mapped to the regular lat-lon grid from the original ECCO lat-lon-cap 90 (llc90) native model grid. SSH (dynamic sea surface height) = SSHNOIBC (dynamic sea surface without the inverse barometer correction) - SSHIBC (inverse barometer correction). The inverted barometer correction accounts for variations in sea surface height due to atmospheric pressure variations.
    coordinates_comment :
    Note: the global 'coordinates' attribute describes auxillary coordinates.
    creator_email :
    ecco-group@mit.edu
    creator_institution :
    NASA Jet Propulsion Laboratory (JPL)
    creator_name :
    ECCO Consortium
    creator_type :
    group
    creator_url :
    https://ecco-group.org
    date_created :
    2020-12-18T09:39:51
    date_issued :
    2020-12-18T09:39:51
    date_metadata_modified :
    2021-03-15T22:07:49
    date_modified :
    2021-03-15T22:07:49
    geospatial_bounds_crs :
    EPSG:4326
    geospatial_lat_max :
    90.0
    geospatial_lat_min :
    -90.0
    geospatial_lat_resolution :
    0.5
    geospatial_lat_units :
    degrees_north
    geospatial_lon_max :
    180.0
    geospatial_lon_min :
    -180.0
    geospatial_lon_resolution :
    0.5
    geospatial_lon_units :
    degrees_east
    history :
    Inaugural release of an ECCO Central Estimate solution to PO.DAAC
    id :
    10.5067/ECG5M-SSH44
    institution :
    NASA Jet Propulsion Laboratory (JPL)
    instrument_vocabulary :
    GCMD instrument keywords
    keywords :
    EARTH SCIENCE > OCEANS > SEA SURFACE TOPOGRAPHY > SEA SURFACE HEIGHT, EARTH SCIENCE SERVICES > MODELS > EARTH SCIENCE REANALYSES/ASSIMILATION MODELS
    keywords_vocabulary :
    NASA Global Change Master Directory (GCMD) Science Keywords
    license :
    Public Domain
    metadata_link :
    https://cmr.earthdata.nasa.gov/search/collections.umm_json?ShortName=ECCO_L4_SSH_05DEG_MONTHLY_V4R4
    naming_authority :
    gov.nasa.jpl
    platform :
    ERS-1/2, TOPEX/Poseidon, Geosat Follow-On (GFO), ENVISAT, Jason-1, Jason-2, CryoSat-2, SARAL/AltiKa, Jason-3, AVHRR, Aquarius, SSM/I, SSMIS, GRACE, DTU17MDT, Argo, WOCE, GO-SHIP, MEOP, Ice Tethered Profilers (ITP)
    platform_vocabulary :
    GCMD platform keywords
    processing_level :
    L4
    product_name :
    SEA_SURFACE_HEIGHT_mon_mean_2014-12_ECCO_V4r4_latlon_0p50deg.nc
    product_time_coverage_end :
    2018-01-01T00:00:00
    product_time_coverage_start :
    1992-01-01T12:00:00
    product_version :
    Version 4, Release 4
    program :
    NASA Physical Oceanography, Cryosphere, Modeling, Analysis, and Prediction (MAP)
    project :
    Estimating the Circulation and Climate of the Ocean (ECCO)
    publisher_email :
    podaac@podaac.jpl.nasa.gov
    publisher_institution :
    PO.DAAC
    publisher_name :
    Physical Oceanography Distributed Active Archive Center (PO.DAAC)
    publisher_type :
    institution
    publisher_url :
    https://podaac.jpl.nasa.gov
    references :
    ECCO Consortium, Fukumori, I., Wang, O., Fenty, I., Forget, G., Heimbach, P., & Ponte, R. M. 2020. Synopsis of the ECCO Central Production Global Ocean and Sea-Ice State Estimate (Version 4 Release 4). doi:10.5281/zenodo.3765928
    source :
    The ECCO V4r4 state estimate was produced by fitting a free-running solution of the MITgcm (checkpoint 66g) to satellite and in situ observational data in a least squares sense using the adjoint method
    standard_name_vocabulary :
    NetCDF Climate and Forecast (CF) Metadata Convention
    summary :
    This dataset provides monthly-averaged dynamic sea surface height interpolated to a regular 0.5-degree grid from the ECCO Version 4 Release 4 (V4r4) ocean and sea-ice state estimate. Estimating the Circulation and Climate of the Ocean (ECCO) state estimates are dynamically and kinematically-consistent reconstructions of the three-dimensional, time-evolving ocean, sea-ice, and surface atmospheric states. ECCO V4r4 is a free-running solution of a global, nominally 1-degree configuration of the MIT general circulation model (MITgcm) that has been fit to observations in a least-squares sense. Observational data constraints used in V4r4 include sea surface height (SSH) from satellite altimeters [ERS-1/2, TOPEX/Poseidon, GFO, ENVISAT, Jason-1,2,3, CryoSat-2, and SARAL/AltiKa]; sea surface temperature (SST) from satellite radiometers [AVHRR], sea surface salinity (SSS) from the Aquarius satellite radiometer/scatterometer, ocean bottom pressure (OBP) from the GRACE satellite gravimeter; sea-ice concentration from satellite radiometers [SSM/I and SSMIS], and in-situ ocean temperature and salinity measured with conductivity-temperature-depth (CTD) sensors and expendable bathythermographs (XBTs) from several programs [e.g., WOCE, GO-SHIP, Argo, and others] and platforms [e.g., research vessels, gliders, moorings, ice-tethered profilers, and instrumented pinnipeds]. V4r4 covers the period 1992-01-01T12:00:00 to 2018-01-01T00:00:00.
    time_coverage_duration :
    P1M
    time_coverage_end :
    2015-01-01T00:00:00
    time_coverage_resolution :
    P1M
    time_coverage_start :
    2014-12-01T00:00:00
    title :
    ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4)
    uuid :
    08a2fc68-4158-11eb-b498-0cc47a3f6943
  • Read multiple netCDF4 files using Kerchunk reference file

    Combine the individual reference files into a single time series reference object

    %%time
    
    ds_k =[]
    for ref in reference_list:
        s_opts = s_opts
        r_opts = r_opts
        fs = fsspec.filesystem("reference",
                               fo=ref,
                               ref_storage_args=s_opts,
                               remote_protocol='s3',
                               remote_options=r_opts)
        m = fs.get_mapper("")
        ds_k.append(xr.open_dataset(m, engine="zarr", backend_kwargs={'consolidated':False}, chunks={}))
        
    ds_multi = xr.concat(ds_k, dim='time')
        
    ds_multi
    CPU times: user 735 ms, sys: 31.4 ms, total: 766 ms
    Wall time: 3.57 s
    <xarray.Dataset>
    Dimensions:         (time: 13, latitude: 360, longitude: 720, nv: 2)
    Coordinates:
      * latitude        (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75
        latitude_bnds   (latitude, nv) float32 -90.0 -89.5 -89.5 ... 89.5 89.5 90.0
      * longitude       (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8
        longitude_bnds  (longitude, nv) float32 -180.0 -179.5 -179.5 ... 179.5 180.0
      * time            (time) datetime64[ns] 2014-12-16T12:00:00 ... 2015-12-16T...
        time_bnds       (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>
    Dimensions without coordinates: nv
    Data variables:
        SSH             (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
        SSHIBC          (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
        SSHNOIBC        (time, latitude, longitude) float32 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>
    Attributes: (12/57)
        Conventions:                  CF-1.8, ACDD-1.3
        acknowledgement:              This research was carried out by the Jet Pr...
        author:                       Ian Fenty and Ou Wang
        cdm_data_type:                Grid
        comment:                      Fields provided on a regular lat-lon grid. ...
        coordinates_comment:          Note: the global 'coordinates' attribute de...
        ...                           ...
        time_coverage_duration:       P1M
        time_coverage_end:            2015-01-01T00:00:00
        time_coverage_resolution:     P1M
        time_coverage_start:          2014-12-01T00:00:00
        title:                        ECCO Sea Surface Height - Monthly Mean 0.5 ...
        uuid:                         08a2fc68-4158-11eb-b498-0cc47a3f6943
  • Conventions :
    CF-1.8, ACDD-1.3
    acknowledgement :
    This research was carried out by the Jet Propulsion Laboratory, managed by the California Institute of Technology under a contract with the National Aeronautics and Space Administration.
    author :
    Ian Fenty and Ou Wang
    cdm_data_type :
    Grid
    comment :
    Fields provided on a regular lat-lon grid. They have been mapped to the regular lat-lon grid from the original ECCO lat-lon-cap 90 (llc90) native model grid. SSH (dynamic sea surface height) = SSHNOIBC (dynamic sea surface without the inverse barometer correction) - SSHIBC (inverse barometer correction). The inverted barometer correction accounts for variations in sea surface height due to atmospheric pressure variations.
    coordinates_comment :
    Note: the global 'coordinates' attribute describes auxillary coordinates.
    creator_email :
    ecco-group@mit.edu
    creator_institution :
    NASA Jet Propulsion Laboratory (JPL)
    creator_name :
    ECCO Consortium
    creator_type :
    group
    creator_url :
    https://ecco-group.org
    date_created :
    2020-12-18T09:39:51
    date_issued :
    2020-12-18T09:39:51
    date_metadata_modified :
    2021-03-15T22:07:49
    date_modified :
    2021-03-15T22:07:49
    geospatial_bounds_crs :
    EPSG:4326
    geospatial_lat_max :
    90.0
    geospatial_lat_min :
    -90.0
    geospatial_lat_resolution :
    0.5
    geospatial_lat_units :
    degrees_north
    geospatial_lon_max :
    180.0
    geospatial_lon_min :
    -180.0
    geospatial_lon_resolution :
    0.5
    geospatial_lon_units :
    degrees_east
    history :
    Inaugural release of an ECCO Central Estimate solution to PO.DAAC
    id :
    10.5067/ECG5M-SSH44
    institution :
    NASA Jet Propulsion Laboratory (JPL)
    instrument_vocabulary :
    GCMD instrument keywords
    keywords :
    EARTH SCIENCE > OCEANS > SEA SURFACE TOPOGRAPHY > SEA SURFACE HEIGHT, EARTH SCIENCE SERVICES > MODELS > EARTH SCIENCE REANALYSES/ASSIMILATION MODELS
    keywords_vocabulary :
    NASA Global Change Master Directory (GCMD) Science Keywords
    license :
    Public Domain
    metadata_link :
    https://cmr.earthdata.nasa.gov/search/collections.umm_json?ShortName=ECCO_L4_SSH_05DEG_MONTHLY_V4R4
    naming_authority :
    gov.nasa.jpl
    platform :
    ERS-1/2, TOPEX/Poseidon, Geosat Follow-On (GFO), ENVISAT, Jason-1, Jason-2, CryoSat-2, SARAL/AltiKa, Jason-3, AVHRR, Aquarius, SSM/I, SSMIS, GRACE, DTU17MDT, Argo, WOCE, GO-SHIP, MEOP, Ice Tethered Profilers (ITP)
    platform_vocabulary :
    GCMD platform keywords
    processing_level :
    L4
    product_name :
    SEA_SURFACE_HEIGHT_mon_mean_2014-12_ECCO_V4r4_latlon_0p50deg.nc
    product_time_coverage_end :
    2018-01-01T00:00:00
    product_time_coverage_start :
    1992-01-01T12:00:00
    product_version :
    Version 4, Release 4
    program :
    NASA Physical Oceanography, Cryosphere, Modeling, Analysis, and Prediction (MAP)
    project :
    Estimating the Circulation and Climate of the Ocean (ECCO)
    publisher_email :
    podaac@podaac.jpl.nasa.gov
    publisher_institution :
    PO.DAAC
    publisher_name :
    Physical Oceanography Distributed Active Archive Center (PO.DAAC)
    publisher_type :
    institution
    publisher_url :
    https://podaac.jpl.nasa.gov
    references :
    ECCO Consortium, Fukumori, I., Wang, O., Fenty, I., Forget, G., Heimbach, P., & Ponte, R. M. 2020. Synopsis of the ECCO Central Production Global Ocean and Sea-Ice State Estimate (Version 4 Release 4). doi:10.5281/zenodo.3765928
    source :
    The ECCO V4r4 state estimate was produced by fitting a free-running solution of the MITgcm (checkpoint 66g) to satellite and in situ observational data in a least squares sense using the adjoint method
    standard_name_vocabulary :
    NetCDF Climate and Forecast (CF) Metadata Convention
    summary :
    This dataset provides monthly-averaged dynamic sea surface height interpolated to a regular 0.5-degree grid from the ECCO Version 4 Release 4 (V4r4) ocean and sea-ice state estimate. Estimating the Circulation and Climate of the Ocean (ECCO) state estimates are dynamically and kinematically-consistent reconstructions of the three-dimensional, time-evolving ocean, sea-ice, and surface atmospheric states. ECCO V4r4 is a free-running solution of a global, nominally 1-degree configuration of the MIT general circulation model (MITgcm) that has been fit to observations in a least-squares sense. Observational data constraints used in V4r4 include sea surface height (SSH) from satellite altimeters [ERS-1/2, TOPEX/Poseidon, GFO, ENVISAT, Jason-1,2,3, CryoSat-2, and SARAL/AltiKa]; sea surface temperature (SST) from satellite radiometers [AVHRR], sea surface salinity (SSS) from the Aquarius satellite radiometer/scatterometer, ocean bottom pressure (OBP) from the GRACE satellite gravimeter; sea-ice concentration from satellite radiometers [SSM/I and SSMIS], and in-situ ocean temperature and salinity measured with conductivity-temperature-depth (CTD) sensors and expendable bathythermographs (XBTs) from several programs [e.g., WOCE, GO-SHIP, Argo, and others] and platforms [e.g., research vessels, gliders, moorings, ice-tethered profilers, and instrumented pinnipeds]. V4r4 covers the period 1992-01-01T12:00:00 to 2018-01-01T00:00:00.
    time_coverage_duration :
    P1M
    time_coverage_end :
    2015-01-01T00:00:00
    time_coverage_resolution :
    P1M
    time_coverage_start :
    2014-12-01T00:00:00
    title :
    ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4)
    uuid :
    08a2fc68-4158-11eb-b498-0cc47a3f6943
  • ds_multi['SSH']
    <xarray.DataArray 'SSH' (time: 13, latitude: 360, longitude: 720)>
    dask.array<concatenate, shape=(13, 360, 720), dtype=float32, chunksize=(1, 360, 720), chunktype=numpy.ndarray>
    Coordinates:
      * latitude   (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75
      * longitude  (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8
      * time       (time) datetime64[ns] 2014-12-16T12:00:00 ... 2015-12-16T12:00:00
    Attributes:
        comment:                Dynamic sea surface height anomaly above the geoi...
        coverage_content_type:  modelResult
        long_name:              Dynamic sea surface height anomaly
        standard_name:          sea_surface_height_above_geoid
        units:                  m
        valid_max:              1.4207719564437866
        valid_min:              -1.8805772066116333
    # Commenting for quarto site render
    # ds_multi['SSH'].hvplot.image()

    References